package com.xxxx.server.config.security.component;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtTokenUtil {
    private static final String CLAIM_KEY_USERNAMR="sub";
    private static final String CLAIM_KEY_CREEEATED="created";
    @Value("${jwt.secret}")
    private String secret;
    @Value("${jwt.expiration}")
    private Long expiration;

   /**
    * 根据用户信息生成token
    * */
    public String generateToken(UserDetails userDetails){
        Map<String,Object> claims=new HashMap<>();
        claims.put(CLAIM_KEY_USERNAMR,userDetails.getUsername());
        claims.put(CLAIM_KEY_CREEEATED,new Date());
        return generateToken(claims);

    }
    /** 从token中获取登录用户名   */
    public String getUserNameFromToken(String token){
        String username;
        try{
            Claims claims=getClaimsFormToken(token);
            username=claims.getSubject();
        }
        catch(Exception e){
            username=null;
        }

        return username;

    }
    /**
     * 验证token是否有效
     *
     * */
    public boolean  validateToken(String token,UserDetails userDetails){
        String username=getUserNameFromToken(token);
        return username.equals(userDetails.getUsername())&&!isTokenExpired(token);

    }
    /**
     * 判断token是否可以被刷新
     * */
    public boolean canReFresh(String token){
        return !isTokenExpired(token);
    }
    /**
     * 刷新token
     *
     * */
    public String refreshToken(String token){
        Claims claims=getClaimsFormToken(token);
        claims.put(CLAIM_KEY_CREEEATED,new Date());
        return generateToken(claims);

    }

    /**
     * 根据荷载生成jwt token
     *
     * */
    private String generateToken(Map<String,Object> claims){
        return Jwts.builder()//返回的字符串便是我们的json web token串了
                   .setClaims(claims)//设置荷载，setSubject是设置主题
                   .setExpiration(generateExpirationDate())//设置失效时间
                   .signWith(SignatureAlgorithm.HS512,secret)//设置算法
                   .compact();//这个是全部设置完成后拼成jwt串的方法
    }

    /**
     * 从token中获取荷载
     *
     * */
    private Claims getClaimsFormToken(String token){
         Claims claims=null;
      try{
          claims=Jwts.parser()
                     .setSigningKey(secret)
                     .parseClaimsJws(token)
                     .getBody();
         }
      catch(Exception e){Jwts.parser();
             e.printStackTrace();
                        }
         return claims;
 }

    /**
     * 生成token失效时间
     *
     * */

    private Date generateExpirationDate() {
        return new Date(System.currentTimeMillis()+expiration*1000);
    }
/**
 * 判断token是否失效
 * */
    private boolean isTokenExpired(String token){
        Date expireDate=getExpiredDateFromToken(token);
        return expireDate.before(new Date());
}

/**
 * 从token中获取失效时间
 * */
    private Date getExpiredDateFromToken(String token){
        Claims claims=getClaimsFormToken(token);
        return claims.getExpiration();
    }



}
